package chat.server.service;

import chat.server.view.ServerView;
import chat.tools.ServiceTools;
import chat.tools.TimerTools;

import javax.swing.*;

/**
 * 服务器事件处理业务类
 *
 * #1 实现每一个按钮对应的功能
 * #2 实现服务器功能
 *
 * @author 谈笑、
 * @dateTime 2020/10/21 22:49
 */
public class ServerService {

	// 定义客户端
	private ServerCore serverCore;

	// 服务器启动时长计时器
	private TimerTools timerTools;

	/**
	 * #1 启动服务器服务
	 */
	public void startServer(ServerView serverView) {
		// 获取到服务器配置IP地址
		String ip = serverView.getjTextFields()[0].getText();

		// 获取到服务器配置端口号
		String port = serverView.getjTextFields()[1].getText();

		// 验证是否输入了IP地址和端口号
		if(ServiceTools.isJTextFieldInput(ip, port)) {

			// 创建实例化一个客户端
			this.serverCore = new ServerCore(serverView);

			// 启动服务器，并获取到启动结果
			if(this.serverCore.startServer(ip, Integer.parseInt(port))) {

				// 创建并开启客户端线程
				new Thread(this.serverCore).start();

				// 启动开启服务时长计时器
				this.timerTools = new TimerTools(serverView.getjLabels()[6], "服务开启时长");
				new Thread(this.timerTools).start();

				// 服务器启动成功，添加消息记录。
				ServiceTools.addSystemNewsRecord(serverView.getjTextArea(), "服务器已启动运行");

				// 设置启动服务后的窗体样式
				ServiceTools.setStartServerWindowStyle(serverView);

			} else {

				// 服务器启动失败，添加消息记录。
				ServiceTools.addSystemNewsRecord(serverView.getjTextArea(), "服务器启动失败");

				// 服务器启动失败
				ServiceTools.tipsFrame(serverView.getjFrame(),
					"服务器启动失败，请检查设置的IP地址和\n端口号是否正确。");

			}

		} else {

			// 没有配置服务器IP地址或端口
			ServiceTools.tipsFrame(serverView.getjFrame(), "服务器IP地址或端口号未设置！");
		}
	}


	/**
	 * #2 停止服务器服务
	 */
	public void stopServer(ServerView serverView) {
		// 获取到所有在线的客户端
		int count  = this.serverCore.getAllClient().size();

		// 如果客户端容器中存在在线的客户端
		if(count > 0) {

			// 弹出确定框
			int result = ServiceTools.confirmFrame(serverView.getjFrame(),
					"当前还有" + count + "个客户端已连接到本服务器，停止服务\n将断开所有客户端的连接，是否继续？");

			// 没有点击确定
			if(result != 0) {
				return;
			}
		}

		// 停止服务器
		this.serverCore.closeServer();

		// 结束服务启动时长计时
		this.timerTools.setTimerToolsRun();

		// 服务器停止运行，添加消息记录。
		ServiceTools.addSystemNewsRecord(serverView.getjTextArea(), "服务器已停止运行");

		// 修改窗体样式
		ServiceTools.setStopServerWindowStyle(serverView);
	}


	/**
	 * #3 退出程序
	 */
	public void serverSignOut(ServerView serverView) {
		// 判断服务器是否在运行
		if(this.serverCore != null && this.serverCore.getServerCoreRun()) {

			// 服务器在运行，弹出确认框。
			int result = ServiceTools.confirmFrame(serverView.getjFrame(),
					"当前服务器正在运行，退出程序将会断开与所有客\n户端的连接，是否继续？");

			// 没有点击确定
			if(result != 0) {
				// 关闭弹窗而不关闭服务窗体
				serverView.getjFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
				return;
			}

		} else {

			// 服务器没有运行，弹出确认框。
			int result = ServiceTools.confirmFrame(serverView.getjFrame(),
					"确定退出程序吗？");

			// 没有点击确定
			if(result != 0) {
				// 关闭弹窗而不关闭服务窗体
				serverView.getjFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
				return;
			}
		}

		// 关闭服务器
		if(this.serverCore != null) {
			this.serverCore.closeServer();
		}

		// 关闭服务器窗体
		serverView.getjFrame().dispose();

		// 关闭虚拟机
		System.exit(1);
	}

}